A Specification and Descripiton Language programozási nyelv (SDL)

Állapotok, szignálok

Mivel az SDL megalkotásának fő célja valósidejű rendszerek fejlesztésének támogatása volt, nagy hangsúly került az állapotgép kezelésének egyszerűségére. Így a nyelv központi elemét jelentik az állapotok és a szignálok.

Az állapotgép mindig valamilyen állapotban várakozik. Speciális állapotnak számít a kezdőállapot. Minden processz a létrejöttekor a kezdőállapotban van, azonban nem maradhat ebben: némi inicializálás után át kell mennie egy másik állapotba (vagy meg kell szűnnie.)

A várakozó állapotgépet egy szignál triggereli. Ekkor végrehajtódik az adott szignálhoz tartozó utasítások láncolata. Ez állhat task-okból, elágazásokból, processz vagy eljáráshívásokból, szignálok küldéséből.

Az eseménysorozatot kétféleképpen zárhatja le az állapotgép: vagy megszűnik, vagy átmegy egy állapotba. Ez utóbbi akár meg is egyezhet a jelenlegi állapottal.

Az állapot jele egy lekerekített sarkú téglalap, míg a szignálok jele egy nyílszerű téglalap. Ez bejövő szignál esetén azt jelenti, hogy a téglalap egyik oldalán egy háromszög alakú bevágás látható, míg kijövő szignál estén egy háromszög alakú kitüremkedés.

Egy állapotban egy szignált csak egy helyen lehet lekezelni. Ezt azért fontos kiemelni, mert az SDL lapszerű szerkezete miatt előfordulhat, hogy a programozó véletlenül több helyen is lekezeli ugyanazt a szignált, ugyanabban az állapotban.

Hasonlóan az elágazáshoz, a szignálkezelésnél sem kötelez a nyelv a teljes állapottér lefedésére, így nem kötelező minden állapotban minden szignált lekezelni. Amennyiben egy adott állapotban olyan szignál érkezik a processzhez, ami nincs lekezelve, úgy az adott szignál elveszik.

A * jellel lehetőség van „minden egyéb állapot”, valamint „minden egyéb szignál” megadására is. Ezen felül lehetőség van a * után állapotok/szignálok felsorolására. Ennek jelentése: „minden egyéb állapot/szignál az alábbiak kivételével.

A szignálok elvesztésének elkerülése érdekében minden állapotban minden szignált értelmesen lekezelni feleslegesen nagy munkát jelentene. Ezért lehetőséget biztosít a nyelv egy szignál elmentésére. Ennek jele egy paralelogramma, benne a szignálok nevével. Ekkor az adott szignál visszakerül a várakozási sorba, és legközelebb csak akkor fog onnan újra kikerülni, ha az állapotgép átment egy másik állapotba. Ekkor a hagyományos módon van lekezelve (vagy akár itt is el lehet menteni). A szignál mentésének közvetlenül kell követnie az állapotot, tehát semmilyen művelet végrehajtására nincs lehetőség, nem függhet semmilyen feltételtől, csupán az állapottól.

A szignálok címzésére három lehetőség van. A legegyszerűbb egy PId típusú változó megadása (TO). Ekkor az adott PId-vel rendelkező processz kapja meg a szignált (amennyiben létezik ilyen processz). Ezen PId helyettesíthető az alábbi literálokkal is:

A harmadik lehetőség úgynevezett gate-eken keresztül (VIA) küldeni a szignálokat. Ezeket a gate-eket a blokkok deklarálják, és fix csatornákat jelentenek blokkok, processzek vagy az SDL és a környezet között.